package cn.bearspark.api.validation;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

/**
 * 校验枚举参数的校验器
 *
 * @author f
 */
public class EnumValidator implements ConstraintValidator<Enumeration, Integer> {

    /**
     * 保存枚举值的 Set 集合
     */
    private final Set<Integer> values = new HashSet<>();

    @Override
    public void initialize(Enumeration enumeration) {
        try {
            // 注意：枚举值必须可以由 getCode() 得到
            Class<? extends Enum<?>> enumClass = enumeration.value();
            Enum<?>[] enumConstants = enumClass.getEnumConstants();
            Method getCodeMethod = enumClass.getMethod("getCode");
            for (Enum<?> enumConstant : enumConstants) {
                values.add((Integer) getCodeMethod.invoke(enumConstant));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext ctx) {
        if (value == null) {
            return false;
        }
        return values.contains(value);
    }

}
